/*
    1. 输入一个二维矩阵 grid[row][col]，其中每个数字代表一个编号
    2. 找出每个数字出现的所有坐标位置，并记录到 posMap 中，同时记录出现次数到 numCount
    3. 遍历每个坐标，如果数字只出现一次，则结果为 -1
    4. 否则计算该点到同值的其他点的最小曼哈顿距离，存入 length[row][col]
*/

#include <stdio.h>      // 输入输出函数，如 printf、scanf
#include <stdlib.h>     // 通用工具函数，如 malloc、abs
#include <string.h>     // 字符串处理，如 memset、strcpy
#include <limits.h>     // 提供 INT_MAX 常量
#include <math.h>       // 数学函数（本例中未使用 sqrt 等，但保留）

#define MAX 100         // 最大矩阵维度

// step 1# 定义结构体 Pos，表示一个坐标位置
typedef struct {
    int x;              // 行号
    int y;              // 列号
} Pos;

// step 2# 定义全局变量
int grid[MAX][MAX];                 // 输入矩阵
Pos posMap[MAX][MAX];              // posMap[num][i] 表示数字 num 出现的第 i 个位置
int numCount[MAX] = {0};           // numCount[num] 表示数字 num 出现的次数
int length[MAX][MAX];              // length[i][j] 表示 grid[i][j] 到其他相同值的最小曼哈顿距离

int main() {
    // step 3# 读取矩阵尺寸
    int row, col;
    scanf("%d%d", &row, &col);     // 输入行列数

    // step 4# 初始化结果矩阵 length 为 INT_MAX（用于找最小值时的初值）
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            length[i][j] = INT_MAX;
        }
    }

    // step 5# 读取矩阵内容并记录每个数字出现的位置
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            scanf("%d", &grid[i][j]);                  // 读取数字
            int curNum = grid[i][j];                   // 当前数字
            posMap[curNum][numCount[curNum]].x = i;    // 记录该数字的行
            posMap[curNum][numCount[curNum]].y = j;    // 记录该数字的列
            numCount[curNum]++;                        // 记录该数字出现次数
        }
    }

    // step 6# 遍历每个单元格，计算最小曼哈顿距离或标记为 -1
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            int curNum = grid[i][j];                   // 当前坐标的数字
            if (numCount[curNum] == 1) {               // 若该数字只出现一次
                length[i][j] = -1;                     // 无其他点，标记为 -1
                continue;
            }

            // step 7# 枚举该数字的所有其他坐标，计算最小曼哈顿距离
            for (int k = 0; k < numCount[curNum]; k++) {
                int curX = posMap[curNum][k].x;
                int curY = posMap[curNum][k].y;

                if (curX != i || curY != j) {          // 跳过自身
                    int distance = abs(curX - i) + abs(curY - j);   // 曼哈顿距离
                    length[i][j] = length[i][j] < distance ? length[i][j] : distance; // 更新最小值
                }
            }
        }
    }

    // step 8# 按要求格式输出结果矩阵
    printf("[");
    for (int i = 0; i < row; i++) {
        printf("[");
        for (int j = 0; j < col; j++) {
            if (j == col - 1) printf("%d", length[i][j]);       // 行尾不加逗号
            else printf("%d, ", length[i][j]);
        }
        if (i == row - 1) printf("]");                          // 最后一行不加逗号
        else printf("], ");
    }
    printf("]");

    return 0;
}
